package service;

import dao.GoodsDao;
import dao.GoodsDaoImpl;
import modle.bo.AddGoodsBO;
import modle.bo.AddGoodsSpecBO;
import modle.vo.GetGoodsByTypeVO;
import modle.Goods;
import modle.Spec;
import modle.Type;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: ZeYu
 * @Date: 2022/3/15 20:51
 */
public class GoodsServiceImpl implements GoodsService {

    private GoodsDao goodsDao=new GoodsDaoImpl();



    @Override
    public List<Type> getType() {
        return goodsDao.getType();
    }

    @Override
    public List<GetGoodsByTypeVO> getGoodsByType(int typeId) {
        return goodsDao.getGoodsTypeId(typeId);
    }
///**
// * 往数据库中商品表、规格表插入数据
// * 其中商品表冗余了两个字段 price 最低价格 stockNum 最大库存或者总库存
// * 运算price以及stockNum
// * 1.插入商品表，拿到id值，赋值给后面规格插入时使用
// * 2.插入规格表 goodsId
// *
// * 插入商品表和插入规格表必须同时成功，同时失败-----事务 Connection autoCommit=false
// * ACID   repeatable read：屏蔽脏读、不可重复读、虚幻读
// * 关于mysql的默认隔离级别repeatable read避免三个问题，尤其虚幻读（前后记录数不一致）
// * 只需要保障：插入商品表、查询最大id、插入规格表在一个事务内即可
// * /关于三层架构下的事务，暂时先搁置，最后一天会介绍
    @Override
    public void addGoods(AddGoodsBO addGoodsBO) {
        List<AddGoodsSpecBO> addGoodsSpecBOS=addGoodsBO.getSpecList();
        double price=addGoodsSpecBOS.get(0).getUnitPrice();

        int stockNum=addGoodsSpecBOS.get(0).getStockNum();


        for (int i=1;i<addGoodsSpecBOS.size();i++){
            if (price>addGoodsSpecBOS.get(i).getUnitPrice()){
                price=addGoodsSpecBOS.get(i).getUnitPrice();
            } if (stockNum<addGoodsSpecBOS.get(i).getStockNum()){
                stockNum=addGoodsSpecBOS.get(i).getStockNum();
            }
        }
        Goods goods= new Goods(null,addGoodsBO.getName(),addGoodsBO.getTypeId(),addGoodsBO.getImg(),addGoodsBO.getDesc(),price,stockNum);
        goodsDao.addGoods(goods);

        int goodsId= goodsDao.selectMaxId();

        List<Spec>specList=new ArrayList<>();
        for (AddGoodsSpecBO addGoodsSpecBO:addGoodsSpecBOS){
            Spec spec=new Spec(null,addGoodsSpecBO.getSpecName(),addGoodsSpecBO.getUnitPrice(),addGoodsSpecBO.getStockNum(),goodsId);
            specList.add(spec);



        }


        goodsDao.addSpec(specList);
    }
}
